查看原文
其他

并发编程之Redis:Redis集群(cluster)搭建

一航 一行Java 2022-08-09

准备工作

5.0之前的版本的集群管理是通过redis-trib.rb,需要依赖ruby;4.0的版本下面测试出了集群管理的bug,经过排查,也得到了官方的证实;如果新搭建的集群,建议使用5.0+的版本;5.0之后的版本,集群管理工具整合到redis-cli,就不需要依赖其他的资源;

  • 安装ruby(5.0+的版本不用安装)

    yum install -y ruby
    yum install -y rubygems
    gem install redis
    //自带的集群工具依赖于ruby

    • 重新安装

      gem install redis

    • ruby版本过低的问题并更新

      ERROR: Error installing redis:
      redis requires Ruby version >= 2.3.0.

    • 安装curl

      yum -y install curl
    • 安装rvm

      gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
      curl -L get.rvm.io | bash -s stable

    • 如果报以上错,按上面的指令执行

      gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
      command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
      command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
    • 查询安装rvm

      curl -L get.rvm.io | bash -s stable

    • 刷新环境变量

      source /etc/profile.d/rvm.sh
    • 查找并安装更新的版本

      rvm list known
      rvm install 2.3.3

    • 使用并卸载老版本

      // 使用新安装的2.3.3
      rvm use 2.3.3
      // 将2.3.3设置为默认
      rvm use 2.3.3 --default
      // 删除默认的2.0.0版本
      rvm remove 2.0.0
      // 查看版本
      ruby --version

基础Redis安装

任何版本的Redis都差不多,按这个 《并发之Redis(一):单机环境的安装(仅仅用于学习测试)》:https://lupf.cn/articles/2020/04/06/1586153137483.html 安装

集群环境配置

  • 集群结构 想要搭建集群,那么至少得需要3台机器,来实现3主(master)3从(slave)的高可用集群,如果出现了高并发或者更多的海量数据的情况,那么就横向扩展更多的master节点,来实现高可用、高并发、海量数据的集群

单机配置

优先从cache0000开始,部署7001和7002;然后其他机器就配置就好了

  • 目录创建

    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7001
    mkdir -p /var/redis-cluster/log/7001
    mkdir -p /var/redis-cluster/data/7002
    mkdir -p /var/redis-cluster/log/7002
  • 创建7001配置文件

    cp /usr/local/redis-4.0.1/redis.conf /etc/redis-cluster/7001.conf
  • 配置7001配置文件

    vim /etc/redis-cluster/7001.conf

    // 修改以下配置
    port 7001
    cluster-enabled yes
    cluster-config-file /etc/redis-cluster/node-7001.conf
    cluster-node-timeout 15000
    daemonize yes
    pidfile /var/run/redis_7001.pid
    dir /var/redis-cluster/data/7001/
    logfile /var/redis-cluster/log/7001/7001.log
    bind 192.168.1.140 127.0.0.1
    appendonly yes
  • 创建7002的配置文件

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7002.conf
    // 将/etc/redis-cluster/7002.conf中的7001全部替换成7002
    sed -i "s/7001/7002/g" /etc/redis-cluster/7002.conf
    // 确认一下配置
    vim /etc/redis-cluster/7002.conf
  • 创建可redis启动文件

    cp /usr/local/redis-4.0.1/utils/redis_init_script /etc/init.d/redis_7001

    // 修改配置文件
    vim /etc/init.d/redis_7001

    // 将端口修改为7001
    REDISPORT=7001

    // 在顶部添加以下注释
    # chkconfig: 2345 90 10
    #
    # description: Redis Start and Stop

    // 修改配置文件的路径
    CONF="/etc/redis-cluster/${REDISPORT}.conf"
  • 准备7002的启动文件

    cp redis_7001 redis_7002
    sed -i "s/7001/7002/g" redis_7002
  • 启动7001、7002

    // 启动redis
    cd /etc/init.d/
    ./redis_7001 start
    ./redis_7002 start

其他机器配置
  • 分别在cache0001和cache0002上面创建目录

    // cache0001
    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7003
    mkdir -p /var/redis-cluster/log/7003
    mkdir -p /var/redis-cluster/data/7004
    mkdir -p /var/redis-cluster/log/7004

    // cache0002
    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7005
    mkdir -p /var/redis-cluster/log/7005
    mkdir -p /var/redis-cluster/data/7006
    mkdir -p /var/redis-cluster/log/7006
  • 在cache0000机器上往其他两台机器拷贝配置文件

    // 在cache0000上执行
    // 拷贝到cache0001
    scp -r /etc/redis-cluster/7001.conf root@cache0001:/etc/redis-cluster/
    scp -r /etc/init.d/redis_7001 root@cache0001:/etc/init.d/

    // 拷贝到cache0002
    scp -r /etc/redis-cluster/7001.conf root@cache0002:/etc/redis-cluster/
    scp -r /etc/init.d/redis_7001 root@cache0002:/etc/init.d/
  • cache0001配置

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7003.conf
    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7004.conf
    sed -i "s/7001/7003/g" /etc/redis-cluster/7003.conf
    sed -i "s/7001/7004/g" /etc/redis-cluster/7004.conf
    sed -i "s/192.168.1.140/192.168.1.141/g" /etc/redis-cluster/7003.conf
    sed -i "s/192.168.1.140/192.168.1.141/g" /etc/redis-cluster/7004.conf
    rm -rf /etc/redis-cluster/7001.conf

    cp /etc/init.d/redis_7001 /etc/init.d/redis_7003
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7004
    sed -i "s/7001/7003/g" /etc/init.d/redis_7003
    sed -i "s/7001/7004/g" /etc/init.d/redis_7004
    rm -rf /etc/init.d/redis_7001

    // 启动redis
    cd /etc/init.d/
    ./redis_7003 start
    ./redis_7004 start

  • cache0002配置

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7005.conf
    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7006.conf
    sed -i "s/7001/7005/g" /etc/redis-cluster/7005.conf
    sed -i "s/7001/7006/g" /etc/redis-cluster/7006.conf
    sed -i "s/192.168.1.140/192.168.1.142/g" /etc/redis-cluster/7005.conf
    sed -i "s/192.168.1.140/192.168.1.142/g" /etc/redis-cluster/7006.conf
    rm -rf /etc/redis-cluster/7001.conf

    cp /etc/init.d/redis_7001 /etc/init.d/redis_7005
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7006
    sed -i "s/7001/7005/g" /etc/init.d/redis_7005
    sed -i "s/7001/7006/g" /etc/init.d/redis_7006
    rm -rf /etc/init.d/redis_7001

    // 启动redis
    cd /etc/init.d/
    ./redis_7005 start
    ./redis_7006 start

5.0之前的构建集群

redis的集群工具会将主从节点自动分散在不同的节点,来实现节点的高可用

// 为了方便后续的操作,这里都执行一下一下指令
cp /usr/local/redis-4.0.1/src/redis-trib.rb /usr/local/bin

redis-trib.rb create --replicas 1 192.168.1.140:7001 192.168.1.140:7002 192.168.1.141:7003 192.168.1.141:7004 192.168.1.142:7005 192.168.1.142:7006

  • 集群的操作指令

    CLUSTER INFO 打印集群的信息
    CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。

    //节点(node)
    CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
    CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
    CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
    CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。

    //槽(slot)
    CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
    CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
    CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
    CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
    CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
    CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
    CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。

    //键 (key)
    CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
    CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
    CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

集群添加从节点
  • 在cache0003新添加一个7007

    mkdir -p /etc/redis-cluster
    mkdir -p /var/redis-cluster/data/7007
    mkdir -p /var/redis-cluster/log/7007

    // 在chche0000上拷贝相关的配置
    scp -r /etc/redis-cluster/7001.conf root@cache0003:/etc/redis-cluster/
    scp -r /etc/init.d/redis_7001 root@cache0003:/etc/init.d/

    cp /etc/redis-cluster/7001.conf /etc/redis-cluster/7007.conf
    sed -i "s/7001/7007/g" /etc/redis-cluster/7007.conf
    sed -i "s/192.168.1.140/192.168.1.143/g" /etc/redis-cluster/7007.conf
    cp /etc/init.d/redis_7001 /etc/init.d/redis_7007
    sed -i "s/7001/7007/g" /etc/init.d/redis_7007

    // 删除无关配置
    rm -rf /etc/init.d/redis_7001
    rm -rf /etc/redis-cluster/7001.conf

    cd /etc/init.d/
    ./redis_7007 start

  • 将节点添加到集群

    CLUSTER MEET 192.168.1.143 7007
  • 集群平衡报错核实貌似是redis的bug: https://github.com/antirez/redis/issues/5029

5.0之后的集群管理

  • 集群管理API

    redis-cli --cluster help

    [root@cache1000 redis-cluster]# redis-cli --cluster help
    Cluster Manager Commands:
    create host1:port1 ... hostN:portN
    --cluster-replicas <arg>
    check host:port
    --cluster-search-multiple-owners
    info host:port
    fix host:port
    --cluster-search-multiple-owners
    reshard host:port
    --cluster-from <arg>
    --cluster-to <arg>
    --cluster-slots <arg>
    --cluster-yes
    --cluster-timeout <arg>
    --cluster-pipeline <arg>
    --cluster-replace
    rebalance host:port
    --cluster-weight <node1=w1...nodeN=wN>
    --cluster-use-empty-masters
    --cluster-timeout <arg>
    --cluster-simulate
    --cluster-pipeline <arg>
    --cluster-threshold <arg>
    --cluster-replace
    add-node new_host:new_port existing_host:existing_port
    --cluster-slave
    --cluster-master-id <arg>
    del-node host:port node_id
    call host:port command arg arg .. arg
    set-timeout host:port milliseconds
    import host:port
    --cluster-from <arg>
    --cluster-copy
    --cluster-replace
    help

    For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
  • 构建集群

    redis-cli --cluster create 192.168.1.160:7001 192.168.1.160:7002 192.168.1.161:7003 192.168.1.161:7004 192.168.1.162:7005 192.168.1.162:7006 --cluster-replicas 1

  • 简单操作测试

    [root@cache1000 init.d]# redis-cli -h 192.168.1.160 -p 7001 // 没有-c参数,如果操作的槽位不在当前节点,就会提示MOVE到对应的节点
    192.168.1.160:7001> get a
    (error) MOVED 15495 192.168.1.162:7005
    192.168.1.160:7001> get b
    [root@cache1000 init.d]# redis-cli -h 192.168.1.160 -p 7001 -c // 加了-c参数之后,会自动重定向
    192.168.1.160:7001> get a
    -> Redirected to slot [15495] located at 192.168.1.162:7005
    (nil)
    192.168.1.162:7005> set a 1
    OK
    192.168.1.162:7005> get a
    "1"
    192.168.1.162:7005> get b
    -> Redirected to slot [3300] located at 192.168.1.161:7004
    "2"
    192.168.1.161:7004>


码字不易,感谢您的点赞!关注!评论!!!


其他文章:
并发编程之Redis:Redis主从架构及哨兵架构

并发编程之Redis:Redis数据持久化及故障恢复方案



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存